#include <iostream>
#include <iomanip>
using namespace std;
#include <new>
#include <cstdlib>
#include "OverLoadingArray.h"

Array::Array(int arraySize)
{
	size = (arraySize>0 ? arraySize : 10);
	ptr = new int[size];   //开辟空间，将数组的首地址给数据成员，这个指针就是自定义数组的首指针
	for(int i=0; i<size; i++)
	{
		ptr[i] = 0;   //给数组初始化，保证数据的一致性；	
	} 
}
Array::Array(const Array &arrayToCopy)
{
	//size = arrayToCopy.size;
	size = arrayToCopy.size;
	ptr = new int[size];
	for(int i=0; i<size; i++)
	{
		ptr[i] = arrayToCopy.ptr[i];    //arrayToCopy是对象名字，ptr它的数据成员； 
	}
} 
Array::~Array()
{
	delete [] ptr;   //删除数组 
}
int Array::getSize() const  //const函数不改变对象数据成员，保护数据不被随便改变
{
	return size; 
} 
int *Array::getPtr() const
{
	return ptr;
}
const Array &Array::operator=(const Array &right)  //函数返回一个Array类的常量引用
{
	if(&right != this)
	{
		if(size != right.size)  
		{
			delete [] ptr;
			size = right.size;	
			ptr = new int [size];
			for(int i=0; i<size; i++)
			{
				ptr[i] = right.ptr[i];
			}
		}	
	} 
	return *this;   //this是对象的指针，*this就是对象的名字 
}
bool Array::operator==(const Array &right) const
{
	if(size != right.size)		//保证了接下来相比较的两个数组大小是一样的，不会出现越界 
		return false;
	for(int i=0; i<size; i++)
	{
		if(ptr[i] != right.ptr[i])
			return false;
	}
	return true;	
}
int &Array::operator[](int subscript)
{
	if(subscript<0 || subscript>=size)
	{
		cout << "Error subscript:" << subscript << "out of range." << "\n";
		exit(1);  //退出程序 
	}
	return ptr[subscript]; 
} 
const int &Array::operator[](int subscript) const
{
	if(subscript<0 || subscript>=size)
	{
		cout << "Error subscript:" << subscript << "out of range." << "\n";
		exit(1);  //退出程序
	}
	return ptr[subscript];
}
istream &operator>>(istream &input, Array &a)  //二元运算符，输出对象a 
{
	for(int i=0; i<a.size; i++)
	{
		input >> a.ptr[i];
	}
	return input;
}
ostream &operator<<(ostream &output, const Array &a)
{
	int i;	
	for(i=0; i<a.getSize(); i++)
	{
		output << setw(12) << a.ptr[i];
		if((i+1)%4 == 0)
			cout << "\n";
	}
	if((i%4) != 0)
		cout << "\n";    //最后一行打印完之后换行。不是i+1是因为最后一个i从for循环出来已经是加1了。 	
	return output; 
}

